package edu.utn.tacs.grupouno.dao.implementations;

import java.util.List;
import java.util.UUID;

import org.hibernate.Query;
import org.hibernate.Session;

import edu.utn.tacs.grupouno.dao.PacientesDAO;
import edu.utn.tacs.grupouno.negocio.Analisis;
import edu.utn.tacs.grupouno.negocio.Estudio;
import edu.utn.tacs.grupouno.negocio.Indicador;
import edu.utn.tacs.grupouno.negocio.Medico;
import edu.utn.tacs.grupouno.negocio.Paciente;
import edu.utn.tacs.grupouno.negocio.RangoValorReferencia;
import edu.utn.tacs.grupouno.negocio.ResultadoNumerico;

public class PacientesDAOHibernate extends AbstractHibernateDAO implements PacientesDAO {
	
	private void initTest() {
		Query query = getSession().createQuery("from Paciente");
		if(!query.list().isEmpty()) {
			return;
		}
		Session session = getSession();
		Paciente p1 = new Paciente();
		Paciente p2 = new Paciente();
		Paciente p3 = new Paciente();
		Paciente p4 = new Paciente();
		p1.setNombre("Jorge Luis");
		p2.setNombre("Adolfo");
		p3.setNombre("Julio");
		p4.setNombre("Leopoldo");
		session.save(p1);
		session.save(p2);
		session.save(p3);
		session.save(p4);
		
		Medico m1 = new Medico();
		Medico m2 = new Medico();
		Medico m3 = new Medico();
		m1.setNombre("Pedro Bonifacio");
		m2.setNombre("Abelardo");
		m3.setNombre("Roberto");
		session.save(m1);  //pincha si no se graba!!!!
		session.save(m2);
		session.save(m3);
		
		Estudio e1 = new Estudio();
		Estudio e2 = new Estudio();
		Estudio e3 = new Estudio();
		Estudio e4 = new Estudio();
		e1.setNombre("Conteo Sperma");
		e2.setNombre("Acido urico");
		e3.setNombre("Anticuerpos");
		e4.setNombre("Colesterol");
		
		Indicador i1 = new Indicador(new RangoValorReferencia(10000, 20000));
		Indicador i2 = new Indicador(new RangoValorReferencia(100, 500));
		Indicador i3 = new Indicador(new RangoValorReferencia(600, 700));
		Indicador i4 = new Indicador(new RangoValorReferencia(140, 190));
		
		session.save(((RangoValorReferencia)i1.getValor()).getValorMinimo());
		session.save(((RangoValorReferencia)i2.getValor()).getValorMinimo());
		session.save(((RangoValorReferencia)i3.getValor()).getValorMinimo());
		session.save(((RangoValorReferencia)i4.getValor()).getValorMinimo());

		session.flush();
		session.save(((RangoValorReferencia)i1.getValor()).getValorMinimo());
		session.save(((RangoValorReferencia)i2.getValor()).getValorMinimo());
		session.save(((RangoValorReferencia)i3.getValor()).getValorMinimo());
		session.save(((RangoValorReferencia)i4.getValor()).getValorMaximo());
		session.flush();
		session.save(i1.getValor());
		session.save(i2.getValor());
		session.save(i3.getValor());
		session.save(i4.getValor());
		session.flush();
		
		i1.setNombre("De 10K hasta 20K");
		i2.setNombre("De 100 hasta 500");
		i3.setNombre("De 600 hasta 700");
		i4.setNombre("De 140 hasta 190");
		
		i1.setResultado(new ResultadoNumerico(5000));
		i2.setResultado(new ResultadoNumerico(200));
		i3.setResultado(new ResultadoNumerico(500));
		i4.setResultado(new ResultadoNumerico(180));
		
		session.save(i1.getResultado());
		session.save(i2.getResultado());
		session.save(i3.getResultado());
		session.save(i4.getResultado());
		session.flush();
		e1.addIndicador(i1); //aca ta el problema 
		e2.addIndicador(i2);
		e2.addIndicador(i3);
		e3.addIndicador(i4);
		session.save(i1);
		session.save(i2);
		session.save(i3);
		session.save(i4);
		session.flush();

		session.save(e1); //no hacen falta
		session.save(e2);
		session.save(e3);
		session.save(e4);
		session.flush();
		
		Analisis a1 = new Analisis();
		a1.setPaciente(p1);
		a1.setMedico(m1);
		a1.addEstudio(e1);
		a1.addEstudio(e2);
		session.save(a1);
		session.flush();
		
		Analisis a2 = new Analisis();
		a2.setPaciente(p2);
		a2.setMedico(m2);
		a2.addEstudio(e3);
		session.save(a2);
		session.flush();
		
		Analisis a3 = new Analisis();
		a3.setPaciente(p1);
		a3.setMedico(m3);
		a3.addEstudio(e4);
		session.save(a3);
		session.flush();
		
	}
	@Override
	public void deletePaciente(String id) {
		Paciente paciente = getPaciente(id);
		getSession().delete(paciente);
	}

	@Override
	public void savePaciente(Paciente paciente) {
		getSession().saveOrUpdate(paciente);
	}

	@Override
	public Paciente getPaciente(String id) {
		Paciente paciente = (Paciente) getSession().get(Paciente.class, UUID.fromString(id));
		return paciente;
	}

	@Override
	public List<Paciente> getPacientes() {
		initTest();
		Query query = getSession().createQuery("from Paciente");
		return query.list();
	}

	@Override
	public List<Analisis> getAnalisis(String pacienteId) {
		Query query = getSession().createQuery("from Analisis a where a.paciente.id = ? ");
		query.setParameter(0, UUID.fromString(pacienteId));
		return query.list();
	}
	

}
